/* ========================================================================= */
/* ------------------------------------------------------------------------- */
/*!				\file		CC_Selection.cc
				\date		june 2010
				\author		TNick

				\brief		Implements CC_Selection class


	~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	Please read ReadMe.txt and Licence.txt in root folder
	~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


*/
/* ------------------------------------------------------------------------- */
/* ========================================================================= */
//
//
//
//
/*  INCLUDES    ------------------------------------------------------------ */

#include	"../main.h"

#include	"CC_Selection.h"
#include	"CC_Draw.h"
#include	"CC_Graphic.h"


/*  INCLUDES    ============================================================ */
//
//
//
//
/*  DEFINITIONS    --------------------------------------------------------- */


/*  DEFINITIONS    ========================================================= */
//
//
//
//
/*  DATA    ---------------------------------------------------------------- */


/*  DATA    ================================================================ */
//
//
//
//
/*  FUNCTIONS    ----------------------------------------------------------- */


/* ------------------------------------------------------------------------- */
/* constructor	                                                             */
CC_Selection::CC_Selection() :
		QList<CC_Graphic*>()
{
	/* no space associated at this time */
	pSpace = NULL;


}
/* ========================================================================= */

/* ------------------------------------------------------------------------- */
/* constructor	                                                             */
CC_Selection::CC_Selection(QString pNewName, CC_DrawSpace* pNewSpace) :
		QList<CC_Graphic*>()
{
	/* a space associated at this time */
	pSpace = pNewSpace;

	/* and a name, if we're lucky */
	str_name = pNewName;

}
/* ========================================================================= */


/* ------------------------------------------------------------------------- */
/* destructor	                                                             */
CC_Selection::~CC_Selection()
{


}
/* ========================================================================= */


/* ------------------------------------------------------------------------- */
/* check if an item is valid for adding to this selection                    */
bool					CC_Selection::validate	(CC_Graphic* it)
{
	/* first, enshure item's vaidity */
	if (it == NULL)
		return false;


	/* second, check for the space that this item belongs to */
	CC_DrawSpace* pDSpc = it->Space();
	if (pDSpc == NULL)
		return NULL;


	if (pSpace == NULL)
		{ /* no space is defined, yet */
			pSpace = pDSpc;
			return true;
		}
	else
		{ /* there is a space defined */
			if (pSpace != pDSpc)
				return false;
			return true;
		}
}
/* ========================================================================= */


/* ------------------------------------------------------------------------- */
/* reimplement append                                                        */
void					CC_Selection::append		(QList<CC_Graphic*> &t)
{
	/* discard empty lists */
	if (t.count() < 1)
		return;

	/* iterate and validate all items */
	for (int i = 0; i < t.count(); i++)
		{
			if (!validate(t.at(i)))
				return;
		}

	QList<CC_Graphic*>::append(t); /// call base function
}
/* ========================================================================= */

///* ------------------------------------------------------------------------- */
///* reimplement append                                                        */
//void					CC_Selection::insert		(int i, QList<CC_Graphic*> &t)
//{
//	/* discard empty lists */
//	if (t.count() < 1)
//		return;
//
//	/* iterate and validate all items */
//	for (int j = 0; j < t.count(); j++)
//	{
//		if (!validate(t.at(j)))
//			return;
//	}
//
//	QList<CC_Graphic*>::insert(i, t); /// call base function
//}
///* ========================================================================= */


///* ------------------------------------------------------------------------- */
///* reimplement append                                                        */
//void					CC_Selection::prepend		(QList<CC_Graphic*> &t)
//{
//	/* discard empty lists */
//	if (t.count() < 1)
//		return;
//
//	/* iterate and validate all items */
//	for (int i = 0; i < t.count(); i++)
//	{
//		if (!validate(t.at(i)))
//			return;
//	}
//
//	QList<CC_Graphic*>::prepend(t); /// call base function
//}
///* ========================================================================= */
//
///* ------------------------------------------------------------------------- */
///* reimplement append                                                        */
//void					CC_Selection::push_back		(QList<CC_Graphic*> &t)
//{
//	/* discard empty lists */
//	if (t.count() < 1)
//		return;
//
//	/* iterate and validate all items */
//	for (int i = 0; i < t.count(); i++)
//	{
//		if (!validate(t.at(i)))
//			return;
//	}
//
//	QList<CC_Graphic*>::push_back(t); /// call base function
//}
///* ========================================================================= */

///* ------------------------------------------------------------------------- */
///* reimplement append                                                        */
//void					CC_Selection::push_front		(QList<CC_Graphic*> &t)
//{
//	/* discard empty lists */
//	if (t.count() < 1)
//		return;
//
//	/* iterate and validate all items */
//	for (int i = 0; i < t.count(); i++)
//	{
//		if (!validate(t.at(i)))
//			return;
//	}
//
//	QList<CC_Graphic*>::push_front(t); /// call base function
//}
///* ========================================================================= */
//



/*  FUNCTIONS    =========================================================== */
//
//
//
//
/* ------------------------------------------------------------------------- */
/* ========================================================================= */
